/**
 * @file luogu/6801/main.cpp
 * @brief
 * @see https://www.luogu.com.cn/record/77840112
 * @author Ruiming Guo (guoruiming@stu.scu.edu.cn)
 * @copyright 2022
 * @date 2022/6/23 21:25:48
 **/

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<int> vi;
const int MOD = 1e9 + 7;
const int N = 100005;
ll h[N], w[N];
stack<int> s;
ll C2(ll x) { return x * (x - 1) / 2 % MOD; }
int main() {
  // High rating and good luck!
  int n;
  ll ans = 0;
  cin >> n;
  for (int i = 1; i <= n; ++i) cin >> h[i];
  for (int i = 1; i <= n; ++i) cin >> w[i];
  s.push(0);
  // 注意终止条件为 n+1，最后推进一个空矩形得到结果
  for (int i = 1; i <= n + 1; ++i) {
    // 考虑第 i 个矩形
    ll sw = 0;
    // 如果这个矩形比栈顶矩形低
    while (h[s.top()] > h[i]) {
      int u = s.top();
      s.pop();
      sw = (sw + w[u]) % MOD;  // 当前超高部分的宽度
      ans = (ans +
             (C2(h[u] + 1) - C2(max(h[i], h[s.top()]) + 1))  // 公式的变形
                 * C2(sw + 1) % MOD +
             MOD) %
            MOD;
    }
    w[i] += sw;  // 加宽矩形 i（保证栈的单调性）
    s.push(i);
  }
  cout << ans << endl;
  return 0;
}
